#include <stdio.h>
#include "ofc/DXML.h"
#include "ofc/DFile.h"

#ifdef HAVE_DXML 
@interface MyHandler : Object <DXMLHandler>  // Class for handling of XML source
{
}
- (BOOL) startDocument :(const DXMLChar *) version :(const DXMLChar *) encoding :(int) standalone;
- (BOOL) endDocument;
- (BOOL) startElement :(const DXMLChar *) name;
- (BOOL) attribute :(const DXMLChar *) attribute :(const DXMLChar *) value;
- (BOOL) endElement;
- (BOOL) characters :(const DXMLChar *) text;
- (BOOL) comment :(const DXMLChar *) text;
- (BOOL) processingInstruction :(const DXMLChar *) target :(const DXMLChar *) value;
- (BOOL) startCDATA;
- (BOOL) endCDATA;
- (BOOL) startNamespace :(const DXMLChar *) prefix :(const DXMLChar *) uri;
- (BOOL) endNamespace;
- (BOOL) unparsed :(const DXMLChar *) text;
- (void) error :(int) number :(const char *) name :(int) lineNumber :(int) columnNumber;
@end

@implementation MyHandler

- (BOOL) startDocument :(const DXMLChar *) version :(const DXMLChar *) encoding :(int) standalone
{                                      // Process the start of the xml document
  printf("Start of XML document; version:%s encoding:%s standalone:%d\n", version, encoding, standalone);
  return YES;
}

- (BOOL) endDocument
{
  printf("End of XML document");       // Process the end of the xml document
  return YES;
}

- (BOOL) startElement :(const DXMLChar *) name
{
  printf("Start Element:%s\n", name);  // Process the start of an xml element
  return YES;
}

- (BOOL) attribute :(const DXMLChar *) attribute :(const DXMLChar *) value
{
  printf("Attribute: %s = %s\n", attribute, value); // Process an attribute
  return YES;
}

- (BOOL) endElement
{
  printf("End Element\n");             // Process the end of an xml element
  return YES;
}

- (BOOL) characters :(const DXMLChar *) text
{
  printf("Text:%s\n", text);           // Process normal text
  return YES;
}

- (BOOL) comment :(const DXMLChar *) text
{
  return YES;                          // Ignore comment
}

- (BOOL) processingInstruction :(const DXMLChar *) target :(const DXMLChar *) value
{
  return YES;                          // Ignore PI
}

- (BOOL) startCDATA
{
  return YES;                          // Ignore CDATA
}

- (BOOL) endCDATA
{
  return YES;                          // Ignore CDATA
}

- (BOOL) startNamespace :(const DXMLChar *) prefix :(const DXMLChar *) uri
{
  return YES;                          // Ignore start of namespace
}

- (BOOL) endNamespace
{
  return YES;                          // Ignore end of name sapce
}

- (BOOL) unparsed :(const DXMLChar *) text
{
  return YES;                          // Ignore unparsed text
}

- (void) error :(int) number :(const char *) name :(int) lineNumber :(int) columnNumber
{
  printf("Error:%s in %s at line:%d and column: %d\n", [DXMLReader errorToString :number], name, lineNumber, columnNumber);
}
@end
#endif

int main(int argc, char *argv[])
{
#ifdef HAVE_DXML 
  MyHandler  *hdlr   = [MyHandler  new];
  DXMLReader *rdr    = [DXMLReader new];
  DFile      *file   = [DFile      new];
  char        name[] = "example.xml";

  if ([file open :name :"r"])
  {
    if ([rdr parse :file :name :hdlr :'|'])
      printf("File \"%s\" succesfully parsed.\n", name);
    else
      printf("Error during parsing of \"%s\".", name);

    [file close];
  }
  else
    printf("Could not open \"%s\".\n", name);

  [rdr  free];                         // Cleanup
  [hdlr free];
  [file free];
#else
  printf("DXML is not present in the library.\n");
#endif
  return 0;
}

